#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 1. 进程和线程


# 线程启动
"""
import threading

def worker():
    print("I'm working")
    print('Finished')

t = threading.Thread(target=worker,name='worker') # 线程对象
t.start() # 启动.
'''
通过threading.Thread创建一个线程对象,target是目标函数,name可以指定名称.
但是线程没有启动,需要调用start方法.
线程之所以执行函数,是因为线程中就是执行代码的,而最简单的封装是函数,还是函数调用.
函数执行完,线程就退出了.
'''
"""

# 让线程一直工作:
"""
import threading,time

def worker():
    while True:
        time.sleep(1)
        print("I'm working")
    print('Finished')

t = threading.Thread(target=worker,name='worker') # 线程对象
t.start() # 启动
"""


'''
线程退出:
Python没有提供线程退出的方法,线程在下面情况时退出:
1. 线程函数内语句执行完毕.
2. 线程函数中抛出未处理的异常.
'''
"""
import threading,time

def worker():
    count = 0
    while True:
        if (count > 5):
            # raise RuntimeError(count)
            # return
            break
        time.sleep(1)
        print("I'm working")
        count += 1

t = threading.Thread(target=worker,name='Worker') # 线程对象
t.start() # 启动.
print('==End==')
'''
Python的线程没有优先级,没有线程组的概念,也不能被销毁,停止,挂起,那也就没有恢复,中断了.
'''
"""



# 线程的传参
"""
import threading,time

def add(x,y):
    print('{} + {} = {}'.format(x,y,x + y,threading.current_thread().ident))

thread1 = threading.Thread(target=add,name='add',args=(4,5)) # 线程对象.
thread1.start() # 启动.
time.sleep(2)

thread2 = threading.Thread(target=add,name='add',args=(5,),kwargs={'y':4}) # 线程对象
thread2.start() # 启动
time.sleep(2)

thread3 = threading.Thread(target=add,name='add',kwargs={'x':4,'y':5}) # 线程对象
thread3.start() # 启动.
# 线程传参和函数传参没什么区别,本质上是函数传参.
"""



# threading的属性和方法
'''
current_thread() : 返回当前线程对象　　
main_thread() : 返回主线程对象　　
active_count() : 当前处理alive状态的线程个数　
enumerate() : 返回所有活着的线程的列表,不包括已经终止的线程和未开始的线程  
get_ident() : 返回当前线程的ID,非0整数. 

active_count和enumerate方法返回的值还包括主线程.
'''
"""
import threading,time

def showthreadinfo():
    print("currentthread = {}".format(threading.current_thread()))
    print("main thread = {}".format(threading.main_thread()))
    print("active count = {}".format(threading.active_count()))

def worker():
    count = 0
    showthreadinfo()
    while True:
        if (count > 5):
            break
        time.sleep(1)
        count += 1
        print("I'm working")

t = threading.Thread(target=worker,name='worker') #线程对象
showthreadinfo()
t.start() # 启动
print('==Eng==')
"""


# Thread实例的属性和方法
'''
name : 只是一个名字,只是个标识,名称可以重名. getName(),setName()获取,设置这个名词.
ident : 线程ID,它是非0整数,线程启动后才会有ID,否则为None,线程退出,此ID依旧可以访问. 此ID可以重复使用.
is_alive() : 返回线程是否活着.

注意: 线程的name这是一个名称,可以重复;ID必须唯一,但可以在线程退出后再利用.
'''
"""
import threading,time

def worker():
    count = 0
    while True:
        if (count > 5):
            break
        time.sleep(1)
        count += 1
        print(threading.current_thread().name)

t = threading.Thread(name='worker',target=worker)
print(t.ident)
t.start()
print('=====END====')
while True:
    time.sleep(1)
    if t.is_alive():
        print('{} {} alive'.format(t.name,t.ident))
    else:
        print('{} {} dead'.format(t.name,t.ident))
        t.start() #不可以.
"""



'''
start() : 启动线程.每一个线程必须且只能执行该方法一次.
run() : 运行线程函数.
'''
# start方法, 派生一个Thread的子类
"""
import threading,time

def worker():
    count = 0
    while True:
        if (count > 5):
            break
        time.sleep(1)
        count += 1
        print('worker running')

class MyThread(threading.Thread):
    def start(self):
        print('start~~~~~~~~~')
        super().start()

    def run(self):
        print('run~~~~~~~')
        super().run()

t = MyThread(name='worker',target=worker)
t.start()
"""

# run方法
"""
import threading,time

def worker():
    count = 0
    while True:
        if (count > 5):
            break
        time.sleep(1)
        count += 1
        print('worker running')

class MyThread(threading.Thread):
    def start(self):
        print('start~~~~~~')
        super().start()

    def run(self):
        print('run------')
        super().run()

t = MyThread(name='worker',target=worker)
# t.start()
print('=========')
t.run()
"""
# start()方法会调用run()方法,而run()方法可以运行函数.

